package users

import (
	"ginstudy/app/global/consts"
	"ginstudy/app/http/controller/web"
	data_transfer "ginstudy/app/http/validator/core/data_transfer"
	"ginstudy/app/utils/response"

	"github.com/gin-gonic/gin"
)

type Register struct {
	// 表单参数验证器结构体支持匿名结构体嵌套
	BaseField
	Phone  string `form:"phone" json:"phone"`     // 手机号，非必填
	CardNo string `form:"card_no" json:"card_no"` // 身份证号码，非必填
}

// 特别注意：表单参数验证器结构体的函数，绝对不能绑定在指针上
// 我们这部分代码项目启动后会加载到容器，如果绑定在指针，一次请求之后，会造成容器中的代码段被污染

func (r Register) CheckParams(context *gin.Context) {
	// 1.先按照验证器提供的基本语法，基本可以校验90%以上的不合格参数
	if err := context.ShouldBind(&r); err != nil {
		errs := gin.H{
			"tips": "UserRegister参数校验失败，参数不符合规定，user_name 长度(>=1)、pass长度[6,20]、不允许注册",
			"err":  err.Error(),
		}
		response.ErrorParam(context, errs)
		return
	}
	//2.继续验证具有中国特色的参数，例如 身份证号码等，基本语法可以校验长度18位，然后可以自行编写正则表达式等更进一步验证每一部分组成
	// r.CardNo  获取值继续校验，这里省略.....

	// 该函数主要是将本结构体的字段（成员）按照 consts.ValidatorPrefix + json标签对应的键=>值 形式绑定在上下文，便于下一步（控制器）可以直接通过 context.Get(键) 获取相关值
	extraAddBindDataContext := data_transfer.DataAddContext(r, consts.ValidatorPrefix, context)
	if extraAddBindDataContext == nil {
		response.ErrorSystem(context, "UserRegister表单验证器json化失败", "")
	} else {
		// 验证完成，调用控制器，并将验证器成员（字段）递给控制器，保持上下文数据一致性
		(&web.Users{}).Register(extraAddBindDataContext)
	}
}
